// 设计一个随机分配红包方案,要求给定金额和人数后,给每个人随机生成一个红包金额
// 每个人最少1分,并且当前人数正好将给定的金额分完
//----------------------------------------------------------------------------
// 方法一
$cash = 10; // 金额(分)
$num = 5; // 人数
/**
* 金额分配
* 返回各个随机金额的数组,或在失败时返回false
* @param $cash int 金额(分)
* @param $num int 人数
* @return array|false
*/
function distributeCash($cash, $num) {
if ($num < 1 || $cash < $num) {
return false;
}
$data = [];
for($i = $num; $i > 0; $i--) {
if ($i > 1) {
$money = $cash / $i * 2 - 1;
$data[$i] = rand(1, $money);
$cash -= $data[$i];
} else {
$data[$i] = $cash;
}
}
return $data;
}
$list = distributeCash($cash, $num);
if (!$list) {
echo "参数错误<br>\n";
exit;
}
foreach ($list as $item) {
printf("%s<br>\n", $item);
}
//----------------------------------------------------------------------------
// 方法二
$cash = 10; // 金额(分)
$num = 10; // 人数
/**
* 金额分配
* 返回各个随机金额的数组,或在失败时返回false
* @param $cash int 金额(分)
* @param $num int 人数
* @return array|false
*/
function distributeCashV2($cash, $num) {
if ($num < 1 || $cash < $num) {
return false;
}
$count = ceil($num / 2);
$avg = floor($cash / $count);
$data = [];
for ($i = 1; $i <= $count; $i++) {
$rand = mt_rand(1, $avg - 1);
$data[] = $rand;
$cash -= $rand;
if ($i * 2 <= $num) {
$rand2 = $avg - $rand;
$data[] = $rand2;
$cash -= $rand2;
}
}
rsort($data);
$data[0] += $cash;
shuffle($data);
return $data;
}
$list = distributeCashV2($cash, $num);
if (!$list) {
echo "参数错误<br>\n";
exit;
}
foreach ($list as $item) {
printf("%s<br>\n", $item);
}
延伸阅读
- 上一篇:无限递归
- 下一篇:php截取指定长度的
